14. Copy On Resource Manage Class

void lock(Mutex* pm); // Mutext 잠금
void unlock(Mutex* pm); // Mutext 잠금 해제
class Lock{
public:
explicit Lock(Mutex* pm): mutexPtr(pm){
lock(mutexPtr);
}
~Lock(){
unlock(mutexPtr);
}
private:
Mutex* mutexPtr;
};
int main(void){
Mutex m;
// ...
{ // 임계영역(스코프) 정의를 위한 블록
Lock m1(&m);
// ...
} // 임계영역 밖에서 정적 할당한 Lock m1은 해제됨
}
하지만, 도중에 Mutex가 복사되는 경우
Lock ml1(&m); // 생성자
Lock ml2(ml1); // 복사 생성자
아래와 같이 RAII 클래스의 복사에 대한 프로세스를 제한할 수 있다.
1. 복사를 금지
2. 관리하고 있는 자원에 대한 참조 카운팅
3. 관리하고 있는 자원을 복사함
4. 관리하고 있는 자원의 소유권을 이전
1. 복사를 금지
복사 생성자와 복사 대입 연산자(복사 연산 함수)를 private 멤버로 만든다.
class Uncopyable{
protected:
Uncopyable(){}
~Uncopyable(){}
private:
Uncopyable(const Uncopyalbe&);
Uncopyable& operator=(const Uncopyable&);
};
class Lock: private Uncopyable{
public:
// ...
};
2. 관리하고 있는 자원에 대한 참조 카운팅
shared_ptr도 내부적으로 참조 카운팅을 하고 있다.
shared_ptr은 삭제자(deleter) 지정을 허용한다.
class Lock{
public:
explicit Lock(Mutex* pm): mutexPtr(pm, unlock){
lock(mutexPtr.get());
} // unlock 함수를 삭제자로 사용
private:
std::shared_ptr<Mutex> mutexPtr;
};
3. 관리하고 있는 자원 복사
깊은 복사(deep copy)
4. 관리하고 있는 자원의 소유권을 이전
unique_ptr 사용